package condominio.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;












import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Cuota;
import condominio.modelo.Residente;
import condominio.util.ConexionBD;

public class cuotaDAO extends BaseDAO  {

	
	
	public Cuota insertar(Cuota cu) throws DAOExcepcion {
		String query = "insert into cuota(ano,mes,vivienda,importe,fechaVencimiento,FechaPago,tipoPago,importeCancelado) values (?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cu.getanno());
			stmt.setInt(2, cu.getMes());	
			stmt.setInt(3, cu.getVivienda());
			stmt.setDouble(4,cu.getImporte());
			stmt.setDate(5,cu.getFechaVencimiento());
			stmt.setDate(6,cu.getFechaPago());
			stmt.setInt(7,cu.getTipoPago());
			stmt.setDouble(8,cu.getImporteCancelado());
			
			// int i= stmt.executeUpdate();
			stmt.executeUpdate();


		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cu;
			}
	
	
	public Collection<Cuota> listarCuota() throws DAOExcepcion {
		Collection<Cuota> cu = new ArrayList<Cuota>();
		Connection conexion = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conexion = ConexionBD.obtenerConexion();
			String query = "select Ano,Mes,Vivienda,Importe,FechaVencimiento,FechaPago,TipoPago,ImporteCancelado from cuota;";
			stmt = conexion.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota cuo = new Cuota();
				
				cuo.setanno(rs.getInt("Ano"));
				cuo.setMes(rs.getInt("Mes"));	
				cuo.setVivienda(rs.getInt("Vivienda"));
				cuo.setImporte(rs.getDouble("importe"));
				cuo.setFechaVencimiento(rs.getDate("fechaVencimiento"));
				cuo.setFechaPago(rs.getDate("fechaPago"));
				cuo.setTipoPago(rs.getInt("tipoPago"));
				cuo.setImporteCancelado(rs.getDouble("ImporteCancelado"));	
		
				cu.add(cuo);
			}

		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(conexion);
		}
		return cu;
	}
	
	public Collection<Cuota> BuscarCoincidencia(int ano,int mes,int coVivienda) throws DAOExcepcion {
		Collection<Cuota> cu = new ArrayList<Cuota>();
		Connection conexion = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conexion = ConexionBD.obtenerConexion();
			String query = "select Ano,Mes,Vivienda,Importe,FechaVencimiento,FechaPago,TipoPago,ImporteCancelado from cuota where ano= ? and mes = ? and vivienda= ? ;";
			stmt = conexion.prepareStatement(query);
			stmt.setInt(1, ano);
			stmt.setInt(2, mes);
			stmt.setInt(3, coVivienda);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota cuo = new Cuota();
				
				cuo.setanno(rs.getInt("Ano"));
				cuo.setMes(rs.getInt("Mes"));	
				cuo.setVivienda(rs.getInt("Vivienda"));
				cuo.setImporte(rs.getDouble("importe"));
				cuo.setFechaVencimiento(rs.getDate("fechaVencimiento"));
				cuo.setFechaPago(rs.getDate("fechaPago"));
				cuo.setTipoPago(rs.getInt("tipoPago"));
				cuo.setImporteCancelado(rs.getDouble("ImporteCancelado"));	
		
				cu.add(cuo);
			}

		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(conexion);
		}
		return cu;
		
		
		
	}
	
	public int CancelarCuota(Cuota cuo) throws DAOExcepcion {
	    String query = "update cuota set FechaPago= ?, TipoPago= ? , ImporteCancelado=? where ano= ?  and mes = ? ;";
	    Connection con = null;
	    PreparedStatement stmt = null;
	    try {
	            con = ConexionBD.obtenerConexion();
	            stmt = con.prepareStatement(query);
	            
	            stmt.setDate(1, cuo.getFechaPago());
	            stmt.setInt(2, cuo.getTipoPago());
	            stmt.setDouble(3, cuo.getImporteCancelado());
	            stmt.setInt(4, cuo.getanno());
	            stmt.setInt(5, cuo.getMes());
	            
	            int i = stmt.executeUpdate();
	            if (i != 1) {
	                    throw new SQLException(" ERROR : Pago de Cuota No Se Ha Registrado");
	            }
	            return i;
	           
	    } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	    } finally {
	            this.cerrarStatement(stmt);
	            this.cerrarConexion(con);
	    }
	    
	    
	}
	
	
	public int PagarCuota(Cuota cuo) throws DAOExcepcion {
	    String query = "update cuota set FechaPago= ?, TipoPago= ? , ImporteCancelado=? where ano= ?  and mes = ? and vivienda= ? and ImporteCancelado=0 ;";
	    Connection con = null;
	    PreparedStatement stmt = null;
	    try {
	            con = ConexionBD.obtenerConexion();
	            stmt = con.prepareStatement(query);
	            
	            stmt.setDate(1, cuo.getFechaPago());
	            stmt.setInt(2, cuo.getTipoPago());
	            stmt.setDouble(3, cuo.getImporteCancelado());
	            stmt.setInt(4, cuo.getanno());
	            stmt.setInt(5, cuo.getMes());
	            stmt.setInt(6, cuo.getVivienda());
	            
	            int i = stmt.executeUpdate();
	            if (i != 1) {
	                    throw new SQLException(" ERROR : Pago de Cuota No Se Ha Registrado");
	            }
	            return i;
	           
	    } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	    } finally {
	            this.cerrarStatement(stmt);
	            this.cerrarConexion(con);
	    }
	    
	    
	}
	
	
	
	public Collection<Cuota> listarCuotasPendientes(int coVivienda) throws DAOExcepcion {
		Collection<Cuota> cu = new ArrayList<Cuota>();
		Connection conexion = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conexion = ConexionBD.obtenerConexion();
			String query = "select Ano,Mes,Vivienda,Importe,FechaVencimiento,FechaPago,TipoPago,ImporteCancelado from cuota where TIMESTAMPDIFF(DAY,FechaVencimiento,FechaPago)<=0 and ImporteCancelado=0 and  vivienda=?;";
			stmt = conexion.prepareStatement(query);
			stmt.setInt(1, coVivienda);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota cuo = new Cuota();
				
				cuo.setanno(rs.getInt("Ano"));
				cuo.setMes(rs.getInt("Mes"));	
				cuo.setVivienda(rs.getInt("Vivienda"));
				cuo.setImporte(rs.getDouble("importe"));
				cuo.setFechaVencimiento(rs.getDate("fechaVencimiento"));
				cuo.setFechaPago(rs.getDate("fechaPago"));
				cuo.setTipoPago(rs.getInt("tipoPago"));
				cuo.setImporteCancelado(rs.getDouble("ImporteCancelado"));	
		
				cu.add(cuo);
			}

		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(conexion);
		}
		return cu;
	}
	
	public Collection<Cuota> BuscarCuotas(String residente) throws DAOExcepcion {
		Collection<Cuota> cu = new ArrayList<Cuota>();
		Connection conexion = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conexion = ConexionBD.obtenerConexion();
			String query = "select cuota.Ano,cuota.Mes,cuota.Vivienda,cuota.Importe,"+
			"cuota.FechaVencimiento,cuota.FechaPago,cuota.TipoPago,cuota.ImporteCancelado "+
					"from cuota left join (vivienda , residente) on( vivienda.CodigoVivienda = cuota.Vivienda and "+
			"residente.CodigoResidente = vivienda.residente) where residente.ApellidoPaterno=? or "+
					"residente.ApellidoMaterno=? or residente.Nombre=?;";
			stmt = conexion.prepareStatement(query);
			stmt.setString(1, residente);
			stmt.setString(2, residente);
			stmt.setString(3, residente);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota cuo = new Cuota();				
				cuo.setanno(rs.getInt("Ano"));
				cuo.setMes(rs.getInt("Mes"));	
				cuo.setVivienda(rs.getInt("Vivienda"));
				cuo.setImporte(rs.getDouble("Importe"));
				cuo.setFechaVencimiento(rs.getDate("FechaVencimiento"));
				cuo.setFechaPago(rs.getDate("FechaPago"));
				cuo.setTipoPago(rs.getInt("TipoPago"));
				cuo.setImporteCancelado(rs.getDouble("ImporteCancelado"));
		
				cu.add(cuo);
			}

		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(conexion);
		}
		return cu;
	}


	public Cuota cuotaXperiodo(int ano, int mes) throws DAOExcepcion {
		// TODO Auto-generated method stub
		Cuota CU = new Cuota();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			String query ="select cuota.Ano,cuota.Mes,cuota.Vivienda,cuota.Importe, "+
		"cuota.FechaVencimiento,cuota.FechaPago,cuota.TipoPago,cuota.ImporteCancelado "+
					"from cuota  where cuota.Ano=? and cuota.Mes=? ;";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, ano);
			stmt.setInt(2, mes);
			rs = stmt.executeQuery();
			if (rs.next()) {
				CU.setanno(rs.getInt("Ano"));
				CU.setMes(rs.getInt("Mes"));	
				CU.setVivienda(rs.getInt("Vivienda"));
				CU.setImporte(rs.getDouble("Importe"));
				CU.setFechaVencimiento(rs.getDate("FechaVencimiento"));
				CU.setFechaPago(rs.getDate("FechaPago"));
				CU.setTipoPago(rs.getInt("TipoPago"));
				CU.setImporteCancelado(rs.getDouble("ImporteCancelado"));
			}
		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return CU;
	}
	
	
	
	
	
	
	
}
